This is an R Markdown
Notebook. When you execute code within the notebook, the results appear
beneath the code.
Reverse Engineer 2 Notebook
Objective: Analyze data from the Blair and Elrich campaigns for
county executive from 2018 and 2022.
###Question 1:
First thing we did is load up the sets and clean the data:
##Blair 2018 contribs:
blair_contribs_2018 <-read.csv("data2/blair_contribs_2018.csv")
blair_contribs_2018_cleaned <-blair_contribs_2018 %>%
clean_names
blair_contribs_2018_cleaned %>%
mutate(contribution_date = mdy(contribution_date))
blair_contribs_2018_cleaned
###Blair 2022 contribs
blair_contribs_2022 <-read.csv("data2/blair_contribs_2022.csv")
blair_contribs_2022_cleaned <- blair_contribs_2022 %>%
clean_names
blair_contribs_2022_cleaned %>%
mutate(contribution_date = mdy(contribution_date))
blair_contribs_2022_cleaned
###Blair 2022 expenses
blair_expenses_2022 <-read.csv("data2/blair_expenses_2022.csv")
blair_expenses_2022_cleaned <-blair_expenses_2022 %>%
clean_names
blair_expenses_2022_cleaned %>%
mutate(contribution_date = mdy(expenditure_date))
blair_expenses_2022_cleaned
###Blair 2018 expenses
blair_expenses_2018 <-read.csv("data2/blair_expenses_2018.csv")
blair_expenses_2018_cleaned <-blair_expenses_2018 %>%
clean_names()
blair_expenses_2018_cleaned %>%
mutate(contribution_date = mdy(expenditure_date))
blair_expenses_2018_cleaned
##Elrich 2018 contribs:
elrich_contribs_2018 <-read.csv("data2/elrich_contribs_2018.csv")
elrich_contribs_2018_cleaned <-elrich_contribs_2018 %>%
clean_names()
elrich_contribs_2018_cleaned %>%
mutate(contribution_date = mdy(contribution_date))
elrich_contribs_2018_cleaned
###Elrich Contribs 2022
elrich_contribs_2022 <-read.csv("data2/elrich_contribs_2022.csv")
elrich_contribs_2022_cleaned <-elrich_contribs_2022 %>%
clean_names()
elrich_contribs_2022_cleaned %>%
mutate(contribution_date = mdy(contribution_date))
elrich_contribs_2022_cleaned
###Elrich 2018
elrich_expenses_2018 <-read.csv("data2/elrich_expenses_2018.csv")
elrich_expenses_2018_cleaned <-elrich_expenses_2018 %>%
clean_names()
elrich_expenses_2018_cleaned %>%
mutate(contribution_date = mdy(expenditure_date))
elrich_expenses_2018_cleaned
###Elrich Expenses 2022
elrich_expenses_2022 <-read.csv("data2/elrich_expenses_2022.csv")
elrich_expenses_2022_cleaned <-elrich_expenses_2022 %>%
clean_names()
elrich_expenses_2022_cleaned %>%
mutate(contribution_date = mdy(expenditure_date))
elrich_expenses_2022_cleaned
##County primary election results:
dem_precincts_18 <- read.csv("data2/dem_precincts_2018.csv")
dem_precincts_22 <- read.csv("data2/dem_precincts_2022.csv")
dem_county_22 <- read.csv("data2/dem_county_2022.csv")
dem_county_18 <- read.csv("data2/dem_county_2018.csv")
###Question 1 1. How much money did David Blair and Marc Elrich fund
themselves in 2022 vs. 2018? Blair is a businessman and millionaire, so
it makes sense that he’s funding his own campaign. But how much exactly
is he putting into it, and how does it compare to the past election and
to how much Elrich’s campaign is raising?
###2022:
blair_contribs_2022_cleaned %>%
filter(contributor_name == "BLAIR DAVID THOMAS") %>%
group_by(contributor_name) %>%
summarize(total_blair = sum(contribution_amount))
elrich_contribs_2022_cleaned %>%
group_by(contributor_name) %>%
summarize(total_elrich = sum(contribution_amount)) %>%
arrange(desc(total_elrich))
###2018:
blair_contribs_2018_cleaned %>%
filter(contributor_name == "BLAIR DAVID THOMAS") %>%
group_by(contributor_name) %>%
summarize(total_blair = sum(contribution_amount))
elrich_contribs_2018_cleaned %>%
group_by(contributor_name) %>%
summarize(total_elrich = sum(contribution_amount)) %>%
arrange(desc(total_elrich))
###Question 2: Who were the top 5 contributors to Blair and Elrich in
2022? How about in 2018? What are their connections to the
candidates?
###2022
top_blair_contribs_22 <- blair_contribs_2018_cleaned %>%
mutate(contributor_name = case_when(
contributor_name == "BLAIR DAVID THOMAS" ~ "Blair David Thomas",
TRUE ~ contributor_name
)) %>%
group_by(contributor_name) %>%
summarize(total = sum(contribution_amount)) %>%
arrange(desc(total)) %>%
head(5)
top_elrich_contribs_22 <- elrich_contribs_2022_cleaned %>%
group_by(contributor_name) %>%
summarize(total = sum(contribution_amount)) %>%
arrange(desc(total)) %>%
head(6)
###2018
top_blair_contribs_18 <- blair_contribs_2018_cleaned %>%
mutate(contributor_name = case_when(
contributor_name == "BLAIR DAVID THOMAS" ~ "Blair David Thomas",
TRUE ~ contributor_name
)) %>%
group_by(contributor_name) %>%
summarize(total = sum(contribution_amount)) %>%
arrange(desc(total)) %>%
head(5)
top_elrich_contribs_18 <- elrich_contribs_2018_cleaned %>%
group_by(contributor_name) %>%
summarize(total = sum(contribution_amount)) %>%
arrange(desc(total)) %>%
head(6)
###Question 3: David Blair got more early/election day votes in 2022.
Elrich got more Mail-in votes in 2022. How did that compare to 2018?
People want to know how Marc Elrich won both times, first by 72 voters
in 2018 and then 32 in 2022. Where did Marc do well in the three
categories: Early voting, election day, and mail-in votes. Did this sway
the result at all?
dem_county_18_cleaned <-dem_county_18 %>%
clean_names()
dem_county_22_cleaned <-dem_county_22 %>%
clean_names()
blair <- dem_county_18_cleaned %>%
filter(candidate_name == "David Blair")
elrich <- dem_county_18_cleaned %>%
filter(candidate_name == "Marc Elrich")
blair_elrich <- bind_rows(blair, elrich)
blair_elrich
###Question 4: Which parts of the county voted for Elrich and which
voted for Blair based on precinct-level voting? Are there differences in
demographics of those areas? What about income?
###Question 5: Where did David Blair and Marc Elrich spend their
money on campaign finance resources? Ie: Meta advertisements, yard
signs, TV, consulting? This would be interesting to know since Blair
made a very big concerted effort to build his profile during the
campaign while Elrich relied on incumbency and mainly TV ads to help
him.
blair_expenses_2022_cleaned %>%
group_by(expense_category) %>%
summarize(total_category = sum(amount)) %>%
arrange(desc(total_category))
#spent nearly $3.1 mil in 2022 ... top 3 are Media, Salarties and Direct Mail by Mail House (R)
#dive into media
blair_expenses_2022_cleaned %>%
filter(expense_category == "Media") %>%
group_by(expense_purpose) %>%
summarize(total_category = sum(amount)) %>%
arrange(desc(total_category))
Spent 1773.00 on online advertising
elrich_expenses_2022_cleaned %>%
group_by(expense_category) %>%
summarize(total_category = sum(amount)) %>%
arrange(desc(total_category))
Elrich spent $528393.29 on media which is significantly less than
Blair
elrich_expenses_2022_cleaned %>%
filter(expense_category == "Media") %>%
group_by(expense_purpose) %>%
summarize(total_category = sum(amount)) %>%
arrange(desc(total_category))
#Elrich spent 32K on consulting fees.
This is what I wrote for No. 5 “There are signifant differences in
spending between Elrich and Blair here and it shows how the capital on
hand can really influence the means a candidate has to win or lose a
race. Elrich in 2022 went all-in on TV spending. Blair spent a lot more
in 2018 as well.”
LS0tDQp0aXRsZTogIlIgTm90ZWJvb2siDQpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sNCi0tLQ0KDQpUaGlzIGlzIGFuIFtSIE1hcmtkb3duXShodHRwOi8vcm1hcmtkb3duLnJzdHVkaW8uY29tKSBOb3RlYm9vay4gV2hlbiB5b3UgZXhlY3V0ZSBjb2RlIHdpdGhpbiB0aGUgbm90ZWJvb2ssIHRoZSByZXN1bHRzIGFwcGVhciBiZW5lYXRoIHRoZSBjb2RlLiANCg0KDQpSZXZlcnNlIEVuZ2luZWVyIDIgTm90ZWJvb2sNCg0KT2JqZWN0aXZlOiBBbmFseXplIGRhdGEgZnJvbSB0aGUgQmxhaXIgYW5kIEVscmljaCBjYW1wYWlnbnMgZm9yIGNvdW50eSBleGVjdXRpdmUgZnJvbSAyMDE4IGFuZCAyMDIyLg0KDQojIyNRdWVzdGlvbiAxOg0KDQpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0NCmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQpvcHRpb25zKHNjaXBlbj05OTkpDQpsaWJyYXJ5KHRpZHl2ZXJzZSkNCmxpYnJhcnkobHVicmlkYXRlKQ0KbGlicmFyeShqYW5pdG9yKQ0KDQpgYGANCg0KDQoNCkZpcnN0IHRoaW5nIHdlIGRpZCBpcyBsb2FkIHVwIHRoZSBzZXRzIGFuZCBjbGVhbiB0aGUgZGF0YToNCg0KIyNCbGFpciAyMDE4IGNvbnRyaWJzOg0KDQpgYGB7cn0NCmJsYWlyX2NvbnRyaWJzXzIwMTggPC1yZWFkLmNzdigiZGF0YTIvYmxhaXJfY29udHJpYnNfMjAxOC5jc3YiKQ0KYGBgDQoNCmBgYHtyfQ0KYmxhaXJfY29udHJpYnNfMjAxOF9jbGVhbmVkIDwtYmxhaXJfY29udHJpYnNfMjAxOCAlPiUgDQpjbGVhbl9uYW1lcyAgDQogIA0KICANCmJsYWlyX2NvbnRyaWJzXzIwMThfY2xlYW5lZCAlPiUgICANCm11dGF0ZShjb250cmlidXRpb25fZGF0ZSA9IG1keShjb250cmlidXRpb25fZGF0ZSkpIA0KYmxhaXJfY29udHJpYnNfMjAxOF9jbGVhbmVkDQpgYGANCg0KDQojIyNCbGFpciAyMDIyIGNvbnRyaWJzDQoNCmBgYHtyfQ0KYmxhaXJfY29udHJpYnNfMjAyMiA8LXJlYWQuY3N2KCJkYXRhMi9ibGFpcl9jb250cmlic18yMDIyLmNzdiIpDQpgYGANCg0KYGBge3J9DQpibGFpcl9jb250cmlic18yMDIyX2NsZWFuZWQgPC0gYmxhaXJfY29udHJpYnNfMjAyMiAlPiUgDQpjbGVhbl9uYW1lcyANCmBgYCAgDQogIA0KYGBge3J9ICANCmJsYWlyX2NvbnRyaWJzXzIwMjJfY2xlYW5lZCAlPiUgDQptdXRhdGUoY29udHJpYnV0aW9uX2RhdGUgPSBtZHkoY29udHJpYnV0aW9uX2RhdGUpKSANCg0KYmxhaXJfY29udHJpYnNfMjAyMl9jbGVhbmVkDQpgYGANCg0KIyMjQmxhaXIgMjAyMiBleHBlbnNlcw0KDQpgYGB7cn0NCmJsYWlyX2V4cGVuc2VzXzIwMjIgPC1yZWFkLmNzdigiZGF0YTIvYmxhaXJfZXhwZW5zZXNfMjAyMi5jc3YiKQ0KYGBgDQoNCmBgYHtyfQ0KYmxhaXJfZXhwZW5zZXNfMjAyMl9jbGVhbmVkIDwtYmxhaXJfZXhwZW5zZXNfMjAyMiAlPiUgDQogIGNsZWFuX25hbWVzIA0KYGBgDQoNCmBgYHtyfQ0KYmxhaXJfZXhwZW5zZXNfMjAyMl9jbGVhbmVkICU+JSANCm11dGF0ZShjb250cmlidXRpb25fZGF0ZSA9IG1keShleHBlbmRpdHVyZV9kYXRlKSkgDQoNCmJsYWlyX2V4cGVuc2VzXzIwMjJfY2xlYW5lZA0KYGBgDQoNCiMjI0JsYWlyIDIwMTggZXhwZW5zZXMNCg0KDQpgYGB7cn0NCmJsYWlyX2V4cGVuc2VzXzIwMTggPC1yZWFkLmNzdigiZGF0YTIvYmxhaXJfZXhwZW5zZXNfMjAxOC5jc3YiKQ0KYGBgDQoNCmBgYHtyfQ0KYmxhaXJfZXhwZW5zZXNfMjAxOF9jbGVhbmVkIDwtYmxhaXJfZXhwZW5zZXNfMjAxOCAlPiUgDQogIGNsZWFuX25hbWVzKCkNCmBgYA0KDQpgYGB7cn0NCmJsYWlyX2V4cGVuc2VzXzIwMThfY2xlYW5lZCAlPiUgDQogIG11dGF0ZShjb250cmlidXRpb25fZGF0ZSA9IG1keShleHBlbmRpdHVyZV9kYXRlKSkgDQpibGFpcl9leHBlbnNlc18yMDE4X2NsZWFuZWQgDQpgYGANCg0KIyNFbHJpY2ggMjAxOCBjb250cmliczoNCg0KYGBge3J9DQplbHJpY2hfY29udHJpYnNfMjAxOCA8LXJlYWQuY3N2KCJkYXRhMi9lbHJpY2hfY29udHJpYnNfMjAxOC5jc3YiKQ0KYGBgDQoNCmBgYHtyfQ0KZWxyaWNoX2NvbnRyaWJzXzIwMThfY2xlYW5lZCA8LWVscmljaF9jb250cmlic18yMDE4ICU+JSANCiAgY2xlYW5fbmFtZXMoKQ0KYGBgDQoNCmBgYHtyfQ0KZWxyaWNoX2NvbnRyaWJzXzIwMThfY2xlYW5lZCAlPiUgDQogIG11dGF0ZShjb250cmlidXRpb25fZGF0ZSA9IG1keShjb250cmlidXRpb25fZGF0ZSkpIA0KDQplbHJpY2hfY29udHJpYnNfMjAxOF9jbGVhbmVkDQpgYGANCg0KIyMjRWxyaWNoIENvbnRyaWJzIDIwMjINCg0KYGBge3J9DQplbHJpY2hfY29udHJpYnNfMjAyMiA8LXJlYWQuY3N2KCJkYXRhMi9lbHJpY2hfY29udHJpYnNfMjAyMi5jc3YiKQ0KYGBgDQoNCmBgYHtyfQ0KZWxyaWNoX2NvbnRyaWJzXzIwMjJfY2xlYW5lZCA8LWVscmljaF9jb250cmlic18yMDIyICU+JQ0KICBjbGVhbl9uYW1lcygpDQpgYGANCg0KYGBge3J9DQplbHJpY2hfY29udHJpYnNfMjAyMl9jbGVhbmVkICU+JSANCiAgbXV0YXRlKGNvbnRyaWJ1dGlvbl9kYXRlID0gbWR5KGNvbnRyaWJ1dGlvbl9kYXRlKSkgDQoNCmVscmljaF9jb250cmlic18yMDIyX2NsZWFuZWQNCmBgYA0KDQojIyNFbHJpY2ggMjAxOA0KDQpgYGB7cn0NCmVscmljaF9leHBlbnNlc18yMDE4IDwtcmVhZC5jc3YoImRhdGEyL2VscmljaF9leHBlbnNlc18yMDE4LmNzdiIpDQpgYGANCg0KYGBge3J9DQplbHJpY2hfZXhwZW5zZXNfMjAxOF9jbGVhbmVkIDwtZWxyaWNoX2V4cGVuc2VzXzIwMTggJT4lIA0KICBjbGVhbl9uYW1lcygpDQpgYGANCg0KYGBge3J9DQplbHJpY2hfZXhwZW5zZXNfMjAxOF9jbGVhbmVkICU+JSANCiAgICBtdXRhdGUoY29udHJpYnV0aW9uX2RhdGUgPSBtZHkoZXhwZW5kaXR1cmVfZGF0ZSkpIA0KZWxyaWNoX2V4cGVuc2VzXzIwMThfY2xlYW5lZA0KYGBgDQojIyNFbHJpY2ggRXhwZW5zZXMgMjAyMg0KDQpgYGB7cn0NCmVscmljaF9leHBlbnNlc18yMDIyIDwtcmVhZC5jc3YoImRhdGEyL2VscmljaF9leHBlbnNlc18yMDIyLmNzdiIpDQpgYGANCg0KYGBge3J9DQplbHJpY2hfZXhwZW5zZXNfMjAyMl9jbGVhbmVkIDwtZWxyaWNoX2V4cGVuc2VzXzIwMjIgJT4lIA0KICBjbGVhbl9uYW1lcygpDQpgYGANCg0KYGBge3J9DQplbHJpY2hfZXhwZW5zZXNfMjAyMl9jbGVhbmVkICU+JSANCiAgbXV0YXRlKGNvbnRyaWJ1dGlvbl9kYXRlID0gbWR5KGV4cGVuZGl0dXJlX2RhdGUpKSANCmVscmljaF9leHBlbnNlc18yMDIyX2NsZWFuZWQNCmBgYA0KDQoNCiMjQ291bnR5IHByaW1hcnkgZWxlY3Rpb24gcmVzdWx0czoNCg0KDQoNCmBgYHtyfQ0KZGVtX3ByZWNpbmN0c18xOCA8LSByZWFkLmNzdigiZGF0YTIvZGVtX3ByZWNpbmN0c18yMDE4LmNzdiIpDQpgYGANCg0KYGBge3J9DQpkZW1fcHJlY2luY3RzXzIyIDwtIHJlYWQuY3N2KCJkYXRhMi9kZW1fcHJlY2luY3RzXzIwMjIuY3N2IikNCmBgYA0KDQoNCg0KDQoNCmBgYHtyfQ0KZGVtX2NvdW50eV8yMiA8LSByZWFkLmNzdigiZGF0YTIvZGVtX2NvdW50eV8yMDIyLmNzdiIpDQpgYGANCg0KYGBge3J9DQpkZW1fY291bnR5XzE4IDwtIHJlYWQuY3N2KCJkYXRhMi9kZW1fY291bnR5XzIwMTguY3N2IikNCmBgYA0KDQoNCg0KDQojIyNRdWVzdGlvbiAxIDEuIEhvdyBtdWNoIG1vbmV5IGRpZCBEYXZpZCBCbGFpciBhbmQgTWFyYyBFbHJpY2ggZnVuZCB0aGVtc2VsdmVzIGluIDIwMjIgdnMuIDIwMTg/IEJsYWlyIGlzIGEgYnVzaW5lc3NtYW4gYW5kIG1pbGxpb25haXJlLCBzbyBpdCBtYWtlcyBzZW5zZSB0aGF0IGhl4oCZcyBmdW5kaW5nIGhpcyBvd24gY2FtcGFpZ24uIEJ1dCBob3cgbXVjaCBleGFjdGx5IGlzIGhlIHB1dHRpbmcgaW50byBpdCwgYW5kIGhvdyBkb2VzIGl0IGNvbXBhcmUgdG8gdGhlIHBhc3QgZWxlY3Rpb24gYW5kIHRvIGhvdyBtdWNoIEVscmljaOKAmXMgY2FtcGFpZ24gaXMgcmFpc2luZz8NCg0KIyMjMjAyMjoNCg0KYGBge3J9DQpibGFpcl9jb250cmlic18yMDIyX2NsZWFuZWQgJT4lDQpmaWx0ZXIoY29udHJpYnV0b3JfbmFtZSA9PSAiQkxBSVIgIERBVklEICBUSE9NQVMiKSAlPiUNCmdyb3VwX2J5KGNvbnRyaWJ1dG9yX25hbWUpICU+JQ0Kc3VtbWFyaXplKHRvdGFsX2JsYWlyID0gc3VtKGNvbnRyaWJ1dGlvbl9hbW91bnQpKQ0KYGBgDQoNCmBgYHtyfQ0KZWxyaWNoX2NvbnRyaWJzXzIwMjJfY2xlYW5lZCAlPiUNCmdyb3VwX2J5KGNvbnRyaWJ1dG9yX25hbWUpICU+JQ0Kc3VtbWFyaXplKHRvdGFsX2VscmljaCA9IHN1bShjb250cmlidXRpb25fYW1vdW50KSkgJT4lDQphcnJhbmdlKGRlc2ModG90YWxfZWxyaWNoKSkNCmBgYA0KIyMjMjAxODoNCg0KYGBge3J9DQpibGFpcl9jb250cmlic18yMDE4X2NsZWFuZWQgJT4lDQpmaWx0ZXIoY29udHJpYnV0b3JfbmFtZSA9PSAiQkxBSVIgIERBVklEICBUSE9NQVMiKSAlPiUNCmdyb3VwX2J5KGNvbnRyaWJ1dG9yX25hbWUpICU+JQ0Kc3VtbWFyaXplKHRvdGFsX2JsYWlyID0gc3VtKGNvbnRyaWJ1dGlvbl9hbW91bnQpKQ0KYGBgDQpgYGB7cn0NCmVscmljaF9jb250cmlic18yMDE4X2NsZWFuZWQgJT4lDQpncm91cF9ieShjb250cmlidXRvcl9uYW1lKSAlPiUNCnN1bW1hcml6ZSh0b3RhbF9lbHJpY2ggPSBzdW0oY29udHJpYnV0aW9uX2Ftb3VudCkpICU+JQ0KYXJyYW5nZShkZXNjKHRvdGFsX2VscmljaCkpDQpgYGANCiANCiMjI1F1ZXN0aW9uIDI6IFdobyB3ZXJlIHRoZSB0b3AgNSBjb250cmlidXRvcnMgdG8gQmxhaXIgYW5kIEVscmljaCBpbiAyMDIyPyBIb3cgYWJvdXQgaW4gMjAxOD8gV2hhdCBhcmUgdGhlaXIgY29ubmVjdGlvbnMgdG8gdGhlIGNhbmRpZGF0ZXM/DQoNCg0KIyMjMjAyMg0KYGBge3J9DQp0b3BfYmxhaXJfY29udHJpYnNfMjIgPC0gYmxhaXJfY29udHJpYnNfMjAxOF9jbGVhbmVkICU+JQ0KICBtdXRhdGUoY29udHJpYnV0b3JfbmFtZSA9IGNhc2Vfd2hlbigNCiAgICBjb250cmlidXRvcl9uYW1lID09ICJCTEFJUiAgREFWSUQgIFRIT01BUyIgfiAiQmxhaXIgIERhdmlkICBUaG9tYXMiLA0KICAgIFRSVUUgfiBjb250cmlidXRvcl9uYW1lDQogICkpICU+JQ0KICBncm91cF9ieShjb250cmlidXRvcl9uYW1lKSAlPiUNCiAgc3VtbWFyaXplKHRvdGFsID0gc3VtKGNvbnRyaWJ1dGlvbl9hbW91bnQpKSAlPiUNCiAgYXJyYW5nZShkZXNjKHRvdGFsKSkgJT4lDQogIGhlYWQoNSkNCmBgYA0KDQpgYGB7cn0NCnRvcF9lbHJpY2hfY29udHJpYnNfMjIgPC0gZWxyaWNoX2NvbnRyaWJzXzIwMjJfY2xlYW5lZCAlPiUNCiAgZ3JvdXBfYnkoY29udHJpYnV0b3JfbmFtZSkgJT4lDQogIHN1bW1hcml6ZSh0b3RhbCA9IHN1bShjb250cmlidXRpb25fYW1vdW50KSkgJT4lDQogIGFycmFuZ2UoZGVzYyh0b3RhbCkpICU+JQ0KICBoZWFkKDYpDQpgYGANCg0KIyMjMjAxOA0KDQpgYGB7cn0NCnRvcF9ibGFpcl9jb250cmlic18xOCA8LSBibGFpcl9jb250cmlic18yMDE4X2NsZWFuZWQgJT4lDQogIG11dGF0ZShjb250cmlidXRvcl9uYW1lID0gY2FzZV93aGVuKA0KICAgIGNvbnRyaWJ1dG9yX25hbWUgPT0gIkJMQUlSICBEQVZJRCAgVEhPTUFTIiB+ICJCbGFpciAgRGF2aWQgIFRob21hcyIsDQogICAgVFJVRSB+IGNvbnRyaWJ1dG9yX25hbWUNCiAgKSkgJT4lDQogIGdyb3VwX2J5KGNvbnRyaWJ1dG9yX25hbWUpICU+JQ0KICBzdW1tYXJpemUodG90YWwgPSBzdW0oY29udHJpYnV0aW9uX2Ftb3VudCkpICU+JQ0KICBhcnJhbmdlKGRlc2ModG90YWwpKSAlPiUNCiAgaGVhZCg1KQ0KYGBgDQoNCmBgYHtyfQ0KdG9wX2VscmljaF9jb250cmlic18xOCA8LSBlbHJpY2hfY29udHJpYnNfMjAxOF9jbGVhbmVkICU+JQ0KICBncm91cF9ieShjb250cmlidXRvcl9uYW1lKSAlPiUNCiAgc3VtbWFyaXplKHRvdGFsID0gc3VtKGNvbnRyaWJ1dGlvbl9hbW91bnQpKSAlPiUNCiAgYXJyYW5nZShkZXNjKHRvdGFsKSkgJT4lDQogIGhlYWQoNikNCmBgYA0KDQojIyNRdWVzdGlvbiAzOiBEYXZpZCBCbGFpciBnb3QgbW9yZSBlYXJseS9lbGVjdGlvbiBkYXkgdm90ZXMgaW4gMjAyMi4gRWxyaWNoIGdvdCBtb3JlIE1haWwtaW4gdm90ZXMgaW4gMjAyMi4gSG93IGRpZCB0aGF0IGNvbXBhcmUgdG8gMjAxOD8gUGVvcGxlIHdhbnQgdG8ga25vdyBob3cgTWFyYyBFbHJpY2ggd29uIGJvdGggdGltZXMsIGZpcnN0IGJ5IDcyIHZvdGVycyBpbiAyMDE4IGFuZCB0aGVuIDMyIGluIDIwMjIuIFdoZXJlIGRpZCBNYXJjIGRvIHdlbGwgaW4gdGhlIHRocmVlIGNhdGVnb3JpZXM6IEVhcmx5IHZvdGluZywgZWxlY3Rpb24gZGF5LCBhbmQgbWFpbC1pbiB2b3Rlcy4gRGlkIHRoaXMgc3dheSB0aGUgcmVzdWx0IGF0IGFsbD8NCg0KYGBge3J9DQpkZW1fY291bnR5XzE4X2NsZWFuZWQgPC1kZW1fY291bnR5XzE4ICU+JSANCiAgY2xlYW5fbmFtZXMoKQ0KYGBgDQoNCg0KYGBge3J9DQpkZW1fY291bnR5XzIyX2NsZWFuZWQgPC1kZW1fY291bnR5XzIyICU+JSANCiAgY2xlYW5fbmFtZXMoKQ0KYGBgDQoNCg0KDQpgYGB7cn0NCg0KYmxhaXIgPC0gZGVtX2NvdW50eV8xOF9jbGVhbmVkICU+JQ0KZmlsdGVyKGNhbmRpZGF0ZV9uYW1lID09ICJEYXZpZCBCbGFpciIpDQplbHJpY2ggPC0gIGRlbV9jb3VudHlfMThfY2xlYW5lZCAlPiUNCiAgZmlsdGVyKGNhbmRpZGF0ZV9uYW1lID09ICJNYXJjIEVscmljaCIpDQpibGFpcl9lbHJpY2ggPC0gIGJpbmRfcm93cyhibGFpciwgZWxyaWNoKQ0KYmxhaXJfZWxyaWNoDQpgYGANCg0KDQoNCg0KDQojIyNRdWVzdGlvbiA0OiBXaGljaCBwYXJ0cyBvZiB0aGUgY291bnR5IHZvdGVkIGZvciBFbHJpY2ggYW5kIHdoaWNoIHZvdGVkIGZvciBCbGFpciBiYXNlZCBvbiBwcmVjaW5jdC1sZXZlbCB2b3Rpbmc/IEFyZSB0aGVyZSBkaWZmZXJlbmNlcyBpbiBkZW1vZ3JhcGhpY3Mgb2YgdGhvc2UgYXJlYXM/IFdoYXQgYWJvdXQgaW5jb21lPyANCg0KDQoNCg0KDQojIyNRdWVzdGlvbiA1OiBXaGVyZSBkaWQgRGF2aWQgQmxhaXIgYW5kIE1hcmMgRWxyaWNoIHNwZW5kIHRoZWlyIG1vbmV5IG9uIGNhbXBhaWduIGZpbmFuY2UgcmVzb3VyY2VzPyBJZTogTWV0YSBhZHZlcnRpc2VtZW50cywgeWFyZCBzaWducywgVFYsIGNvbnN1bHRpbmc/IFRoaXMgd291bGQgYmUgaW50ZXJlc3RpbmcgdG8ga25vdyBzaW5jZSBCbGFpciBtYWRlIGEgdmVyeSBiaWcgY29uY2VydGVkIGVmZm9ydCB0byBidWlsZCBoaXMgcHJvZmlsZSBkdXJpbmcgdGhlIGNhbXBhaWduIHdoaWxlIEVscmljaCByZWxpZWQgb24gaW5jdW1iZW5jeSBhbmQgbWFpbmx5IFRWIGFkcyB0byBoZWxwIGhpbS4gDQoNCg0KYGBge3J9DQpibGFpcl9leHBlbnNlc18yMDIyX2NsZWFuZWQgJT4lDQpncm91cF9ieShleHBlbnNlX2NhdGVnb3J5KSAlPiUNCnN1bW1hcml6ZSh0b3RhbF9jYXRlZ29yeSA9IHN1bShhbW91bnQpKSAlPiUNCmFycmFuZ2UoZGVzYyh0b3RhbF9jYXRlZ29yeSkpDQojc3BlbnQgbmVhcmx5ICQzLjEgbWlsIGluIDIwMjIgLi4uIHRvcCAzIGFyZSBNZWRpYSwgU2FsYXJ0aWVzIGFuZCBEaXJlY3QgTWFpbCBieSBNYWlsIEhvdXNlIChSKQ0KYGBgDQojZGl2ZSBpbnRvIG1lZGlhDQpgYGB7cn0NCmJsYWlyX2V4cGVuc2VzXzIwMjJfY2xlYW5lZCAlPiUNCmZpbHRlcihleHBlbnNlX2NhdGVnb3J5ID09ICJNZWRpYSIpICU+JQ0KZ3JvdXBfYnkoZXhwZW5zZV9wdXJwb3NlKSAlPiUNCnN1bW1hcml6ZSh0b3RhbF9jYXRlZ29yeSA9IHN1bShhbW91bnQpKSAlPiUNCmFycmFuZ2UoZGVzYyh0b3RhbF9jYXRlZ29yeSkpDQpgYGANCiMgU3BlbnQgMTc3My4wMAkgb24gb25saW5lIGFkdmVydGlzaW5nDQoNCmBgYHtyfQ0KZWxyaWNoX2V4cGVuc2VzXzIwMjJfY2xlYW5lZCAlPiUNCmdyb3VwX2J5KGV4cGVuc2VfY2F0ZWdvcnkpICU+JQ0Kc3VtbWFyaXplKHRvdGFsX2NhdGVnb3J5ID0gc3VtKGFtb3VudCkpICU+JQ0KYXJyYW5nZShkZXNjKHRvdGFsX2NhdGVnb3J5KSkNCmBgYA0KRWxyaWNoIHNwZW50ICQ1MjgzOTMuMjkgb24gbWVkaWEgd2hpY2ggaXMgc2lnbmlmaWNhbnRseSBsZXNzIHRoYW4gQmxhaXINCg0KYGBge3J9DQplbHJpY2hfZXhwZW5zZXNfMjAyMl9jbGVhbmVkICU+JQ0KZmlsdGVyKGV4cGVuc2VfY2F0ZWdvcnkgPT0gIk1lZGlhIikgJT4lDQpncm91cF9ieShleHBlbnNlX3B1cnBvc2UpICU+JQ0Kc3VtbWFyaXplKHRvdGFsX2NhdGVnb3J5ID0gc3VtKGFtb3VudCkpICU+JQ0KYXJyYW5nZShkZXNjKHRvdGFsX2NhdGVnb3J5KSkNCmBgYA0KDQojRWxyaWNoIHNwZW50IDMySyBvbiBjb25zdWx0aW5nIGZlZXMuDQoNClRoaXMgaXMgd2hhdCBJIHdyb3RlIGZvciBOby4gNSAiVGhlcmUgYXJlIHNpZ25pZmFudCBkaWZmZXJlbmNlcyBpbiBzcGVuZGluZyBiZXR3ZWVuIEVscmljaCBhbmQgQmxhaXIgaGVyZSBhbmQgaXQgc2hvd3MgaG93IHRoZSBjYXBpdGFsIG9uIGhhbmQgY2FuIHJlYWxseSBpbmZsdWVuY2UgdGhlIG1lYW5zIGEgY2FuZGlkYXRlIGhhcyB0byB3aW4gb3IgbG9zZSBhIHJhY2UuIEVscmljaCBpbiAyMDIyIHdlbnQgYWxsLWluIG9uIFRWIHNwZW5kaW5nLiBCbGFpciBzcGVudCBhIGxvdCBtb3JlIGluIDIwMTggYXMgd2VsbC4i